<?php
/**
 * 文件上传controller
 * @author yupoxiong<i@yupoxiong.com>
 */

declare (strict_types = 1);

namespace app\school\controller;
use hg\apidoc\annotation as Apidoc;
use OSS\Core\OssException;
use OSS\OssClient;
use think\exception\ValidateException;
use think\facade\Filesystem;
use think\Request;
use think\response\Json;

/**
 * @Apidoc\Title("图片上传")
 * @Apidoc\Group("index")
 */
class FileController extends ApiBaseController {
	protected array $loginExcept = [
		'api/file/upload',
	];
	/**
	 * @Apidoc\Title("图片上传")
	 * @Apidoc\Desc("图片上传")
	 * @Apidoc\Method("POST")
	 * @Apidoc\Url("/api/file/upload")
	 * @Apidoc\Param("file",          type="file",require=true, desc="file")
	 * @Apidoc\Returned("url",        type="int",                 desc="desc")
	 */
	public function upload(Request $request): Json {
		if ($request->isPost()) {
			$param = $request->param();
			$field = $param['file_field'] ?? 'file';
			$dir = $param['file_dir'] ?? 'uploads';
			// 文件类型，默认图片
			$file_type = $param['file_type'] ?? 'image';
			// 上传到本地，可自行修改为oss之类的
			$config = config('filesystem.disks.public');

			$files = $request->file();

			try {
				validate([$field => $config['validate'][$file_type]])->check($files);
			} catch (ValidateException $e) {
				return json([
					'error' => $e->getMessage(),
				], 500);
			}

			$file = $files[$field];

			$name = Filesystem::putFile($dir, $file);

			$url = $config['url'] . '/' . $name;
			$url = str_replace("\\", '/', $url);
			// $oss = $this->oss($url, $name);
			// if (isset($oss['oss-request-url'])) {
			// 	$url = $oss['oss-request-url'];
			// } else {
			// 	return json($oss);
			// }
			return json([
				'code' => 200,
				'url' => [$url],
			]);
		}

		return admin_error('非法访问');
	}
	public function oss($local_path, $name) {

		// 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
		$accessKeyId = "LTAI4GFvX9mEVsZVgNCK5nu4";
		$accessKeySecret = "PBjBfhi1p95e4sXkgZTVct2W5izpKz";
		// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
		$endpoint = "https://oss-cn-shanghai.aliyuncs.com";
		// 填写Bucket名称，例如examplebucket。
		$bucket = "pkyanglao";
		// 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
		$object = $name;
		// <yourLocalFile>由本地文件路径加文件名包括后缀组成，例如/users/local/myfile.txt。
		// 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
		$filePath = app()->getRootPath() . '/public' . $local_path;

		try {
			$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

			$result = $ossClient->uploadFile($bucket, $object, $filePath);
			return $result;
		} catch (OssException $e) {
			return $e->getMessage();
		}
	}
}
